﻿using System;
using System.Data;
using System.IO;
using System.Windows.Forms;
using System.Xml;
using DBConnect;

namespace TISS_Add_in
{
    public static class CancelaGuia
    {

        /// <summary>
        /// Preenche a Solicitação de Cancelamento de Guia
        /// </summary>
        /// <param name="codPrestadorOrigem">ID do Prestador que está enviando a Solicitação</param>
        /// <param name="regANSDestino">regANS da Operadora a enviar a Solicitação</param>
        /// <param name="numeroGuia">numero da Guia a ser Cancelada</param>
        /// <param name="dataEmissaoGuia">data de Emissão da guia a ser cancelada</param>
        /// <param name="numeroGuiaOperadora">numero da Guia na Operadora</param>
        /// <returns>Solicitação de Cancelamento de Guia preenchida</returns>
        public static docTissCancela.ws_cancelaGuia geraCancelaGuia(long codPrestadorOrigem, string regANSDestino,
            string numeroGuia, string dataEmissaoGuia, string numeroGuiaOperadora)
        {
            docTissCancela.ws_cancelaGuia enviaCancelaGuia = new TISS_Add_in.docTissCancela.ws_cancelaGuia();

            enviaCancelaGuia.cabecalho = (docTissCancela.cabecalhoTransacao)Cabecalho.GeraCabecalho(
                codPrestadorOrigem, regANSDestino, tipoTransacao.CANCELA_GUIA);

            if (enviaCancelaGuia.cabecalho != null)
            {
                try
                {
                    docTissCancela.ct_cancelaGuia cancelaGuia = new TISS_Add_in.docTissCancela.ct_cancelaGuia();
                    cancelaGuia.dadosPrestador = new TISS_Add_in.docTissCancela.ct_contratado();
                    cancelaGuia.dadosPrestador.identificacao = new TISS_Add_in.docTissCancela.ct_identificacaoPrestadorExecutante();
                    cancelaGuia.guia = new TISS_Add_in.docTissCancela.ct_cabecalhoGuia[1];
                    cancelaGuia.guia[0] = new TISS_Add_in.docTissCancela.ct_cabecalhoGuia();

                    DataRow drPrestadorOperadora = CommandModConf.selecionaPrestadorOperadora(Globals.ThisAddIn.UsuarioID, regANSDestino).Tables[0].Rows[0];

                    if (drPrestadorOperadora["codnaOperadora"].ToString() != null)
                    {
                        cancelaGuia.dadosPrestador.identificacao.Item = drPrestadorOperadora["codnaOperadora"].ToString();
                        cancelaGuia.dadosPrestador.identificacao.ItemElementName = TISS_Add_in.docTissCancela.ItemChoiceType.codigoPrestadorNaOperadora;
                    }
                    else if (drPrestadorOperadora["CPF"].ToString() != null)
                    {
                        cancelaGuia.dadosPrestador.identificacao.Item = drPrestadorOperadora["CPF"].ToString();
                        cancelaGuia.dadosPrestador.identificacao.ItemElementName = TISS_Add_in.docTissCancela.ItemChoiceType.CPF;
                    }
                    else if (drPrestadorOperadora["CNPJ"].ToString() != null)
                    {
                        cancelaGuia.dadosPrestador.identificacao.Item = drPrestadorOperadora["CNPJ"].ToString();
                        cancelaGuia.dadosPrestador.identificacao.ItemElementName = TISS_Add_in.docTissCancela.ItemChoiceType.CNPJ;
                    }
                    cancelaGuia.dadosPrestador.nomeContratado = Globals.ThisAddIn.PrestadorNome;
                    if (drPrestadorOperadora["CNES"].ToString() != null)
                        cancelaGuia.dadosPrestador.numeroCNES = drPrestadorOperadora["CNES"].ToString();

                    cancelaGuia.guia[0].registroANS = regANSDestino;
                    cancelaGuia.guia[0].dataEmissaoGuia = dataEmissaoGuia;
                    cancelaGuia.guia[0].numeroGuiaPrestador = numeroGuia;
                    cancelaGuia.guia[0].numeroGuiaOperadora = numeroGuiaOperadora;

                    enviaCancelaGuia.cancelaGuia = cancelaGuia;

                    //Fechando o CancelaGuia e Serializando em Memória
                    Stream streamMensagem = new MemoryStream();
                    streamMensagem = XMLUtils.Serializa(enviaCancelaGuia, null);

                    //Fim da Mensagem: HASH
                    //Lendo a mensagem previamene carregada em memória
                    XmlDocument docMensagem = new XmlDocument();
                    docMensagem.Load(streamMensagem);
                    string TextoHash = "";
                    TextoHash = docMensagem.DocumentElement.InnerText;

                    //Calculando e inserindo o Hash da Mensagem
                    enviaCancelaGuia.hash = AddinUtils.CalculateMD5Hash(TextoHash);
                }
                catch (Exception exx)
                {
                    MessageBox.Show("Erro ao gerar o Cancelamento da guia: " + exx.Message, "Guia não cancelada!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    Mensagem.mensagemTISS_remove(Convert.ToInt64(enviaCancelaGuia.cabecalho.identificacaoTransacao.sequencialTransacao));
                }
            }
            return enviaCancelaGuia;
        }

        public static void recebeCancelaGuia(docTissCancela.ws_reciboCancelaGuia reciboCancelaGuia, long IDLote)
        {
            if (reciboCancelaGuia.reciboCancelaGuia.guiasCanceladas[0].statusCancelamento == TISS_Add_in.docTissCancela.st_statusCancelamento.Item1)
            {
                CommandGuias.cancelaGuia(reciboCancelaGuia.reciboCancelaGuia.guiasCanceladas[0].numeroGuiaPrestador, IDLote);
                MessageBox.Show("Guia cancelada com Sucesso!");
            }
            else
                MessageBox.Show("Solicitação de Cancelamento de Guia enviado com Sucesso!");
        }

        public static void recebeCancelaGuia(docTissCancela.ws_reciboCancelaGuia reciboCancelaGuia, string regANS)
        {
            if (reciboCancelaGuia.reciboCancelaGuia.guiasCanceladas[0].statusCancelamento == TISS_Add_in.docTissCancela.st_statusCancelamento.Item1)
            {
                CommandSolicitacao.cancelaGuiaSolicitacao(reciboCancelaGuia.reciboCancelaGuia.guiasCanceladas[0].numeroGuiaPrestador, Globals.ThisAddIn.UsuarioID, regANS);
                MessageBox.Show("Guia cancelada com Sucesso!");
            }
            else
                MessageBox.Show("Solicitação de Cancelamento de Guia enviado com Sucesso!");
        }
    }
}
